package com.yiguo.common;

import java.lang.reflect.Method;
import java.util.Iterator;
import java.util.List;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.content.Context;
import android.telephony.CellLocation;
import android.telephony.NeighboringCellInfo;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.telephony.gsm.GsmCellLocation;
import android.util.Log;
public class CellInfoManager {
       private int asu;
       private int bid;
       private int cid;
       private boolean isCdma;
       private boolean isGsm;
       private int lac;
       private int lat;
       private final PhoneStateListener listener;
       private int lng;
       private int mcc;
       private int mnc;
       private int nid;
       private int sid;
       private TelephonyManager tel;
       private boolean valid;
       private Context context;
       public CellInfoManager(Context paramContext) {
              this.listener = new CellInfoListener(this);
              tel = (TelephonyManager) paramContext.getSystemService(Context.TELEPHONY_SERVICE);
              this.tel.listen(this.listener, PhoneStateListener.LISTEN_CELL_LOCATION | PhoneStateListener.LISTEN_SIGNAL_STRENGTH);
              context = paramContext;
       }
       public static int dBm(int i) {
              int j;
              if (i >= 0 && i <= 31)
                     j = i * 2 + -113;
              else
                     j = 0;
              return j;
       }
       public int asu() {
              return this.asu;
       }
       public int bid() {
              if (!this.valid)
                     update();
              return this.bid;
       }
       public JSONObject cdmaInfo() {
              if (!isCdma()) {
                     return null;
              }
              JSONObject jsonObject = new JSONObject();
              try {
                     jsonObject.put("bid", bid());
                     jsonObject.put("sid", sid());
                     jsonObject.put("nid", nid());
                     jsonObject.put("lat", lat());
                     jsonObject.put("lng", lng());
              } catch (JSONException ex) {
                     jsonObject = null;
                     Log.e("CellInfoManager", ex.getMessage());
              }
              return jsonObject;
       }
       public JSONArray cellTowers() {
              JSONArray jsonarray = new JSONArray();
              int lat;
              int mcc;
              int mnc;
              int aryCell[] = dumpCells();
              lat = lac();
              mcc = mcc();
              mnc = mnc();
              if (aryCell == null || aryCell.length < 2) {
                     aryCell = new int[2];
                     aryCell[0] = cid;
                     aryCell[1] = -60;
              }
              for (int i = 0; i < aryCell.length; i += 2) {
                     try {
                            int j2 = dBm(i + 1);
                            JSONObject jsonobject = new JSONObject();
                            jsonobject.put("cell_id", aryCell[i]);
                            jsonobject.put("location_area_code", lat);
                            jsonobject.put("mobile_country_code", mcc);
                            jsonobject.put("mobile_network_code", mnc);
                            jsonobject.put("signal_strength", j2);
                            jsonobject.put("age", 0);
                            jsonarray.put(jsonobject);
                     } catch (Exception ex) {
                            ex.printStackTrace();
                            Log.e("CellInfoManager", ex.getMessage());
                     }
              }
              if (isCdma())
                     jsonarray = new JSONArray();
              return jsonarray;
       }
       public int cid() {
              if (!this.valid)
                     update();
              return this.cid;
       }
       public int[] dumpCells() {
              int[] aryCells;
              if (cid() == 0) {
                     aryCells = new int[0];
                     return aryCells;
              }
              List<NeighboringCellInfo> lsCellInfo = this.tel.getNeighboringCellInfo();
              if (lsCellInfo == null || lsCellInfo.size() == 0) {
                     aryCells = new int[1];
                     int i = cid();
                     aryCells[0] = i;
                     return aryCells;
              }
              int[] arrayOfInt1 = new int[lsCellInfo.size() * 2 + 2];
              int j = 0 + 1;
              int k = cid();
              arrayOfInt1[0] = k;
              int m = j + 1;
              int n = asu();
              arrayOfInt1[j] = n;
              Iterator<NeighboringCellInfo> iter = lsCellInfo.iterator();
              while (true) {
                     if (!iter.hasNext()) {
                            break;
                     }
                     NeighboringCellInfo localNeighboringCellInfo = (NeighboringCellInfo) iter.next();
                     int i2 = localNeighboringCellInfo.getCid();
                     if ((i2 <= 0) || (i2 == 65535))
                            continue;
                     int i3 = m + 1;
                     arrayOfInt1[m] = i2;
                     m = i3 + 1;
                     int i4 = localNeighboringCellInfo.getRssi();
                     arrayOfInt1[i3] = i4;
              }
              int[] arrayOfInt2 = new int[m];
              System.arraycopy(arrayOfInt1, 0, arrayOfInt2, 0, m);
              aryCells = arrayOfInt2;
              return aryCells;
       }
       public JSONObject gsmInfo() {
              if (!isGsm()) {
                     return null;
              }
              JSONObject localObject = null;
              while (true) {
                     try {
                            JSONObject localJSONObject1 = new JSONObject();
                            String str1 = this.tel.getNetworkOperatorName();
                            localJSONObject1.put("operator", str1);
                            String str2 = this.tel.getNetworkOperator();
                            if ((str2.length() == 5) || (str2.length() == 6)) {
                                   String str3 = str2.substring(0, 3);
                                   String str4 = str2.substring(3, str2.length());
                                   localJSONObject1.put("mcc", str3);
                                   localJSONObject1.put("mnc", str4);
                            }
                            localJSONObject1.put("lac", lac());
                            int[] arrayOfInt = dumpCells();
                            JSONArray localJSONArray1 = new JSONArray();
                            int k = 0;
                            int m = arrayOfInt.length / 2;
                            while (true) {
                                   if (k >= m) {
                                          localJSONObject1.put("cells", localJSONArray1);
                                          localObject = localJSONObject1;
                                          break;
                                   }
                                   int n = k * 2;
                                   int i1 = arrayOfInt[n];
                                   int i2 = k * 2 + 1;
                                   int i3 = arrayOfInt[i2];
                                   JSONObject localJSONObject7 = new JSONObject();
                                   localJSONObject7.put("cid", i1);
                                   localJSONObject7.put("asu", i3);
                                   localJSONArray1.put(localJSONObject7);
                                   k += 1;
                            }
                     } catch (JSONException localJSONException) {
                            localObject = null;
                     }
              }
       }
       public boolean isCdma() {
              if (!this.valid)
                     update();
              return this.isCdma;
       }
       public boolean isGsm() {
              if (!this.valid)
                     update();
              return this.isGsm;
       }
       public int lac() {
              if (!this.valid)
                     update();
              return this.lac;
       }
       public int lat() {
              if (!this.valid)
                     update();
              return this.lat;
       }
       public int lng() {
              if (!this.valid)
                     update();
              return this.lng;
       }
       public int mcc() {
              if (!this.valid)
                     update();
              return this.mcc;
       }
       public int mnc() {
              if (!this.valid)
                     update();
              return this.mnc;
       }
       public int nid() {
              if (!this.valid)
                     update();
              return this.nid;
       }
       public float score() {
              float f1 = 0f;
              int[] aryCells = null;
              int i = 0;
              float f2 = 0f;
              if (isCdma()) {
                     f2 = 1065353216;
                     return f2;
              }
              if (isGsm()) {
                     f1 = 0.0F;
                     aryCells = dumpCells();
                     int j = aryCells.length;
                     if (i >= j)
                            f2 = f1;
              }
              if(i <=0 ) {
                     return 1065353216;
              }
              int m = aryCells[i];
              for (i = 0; i < m; i++) {
                     if ((m < 0) || (m > 31))
                            f1 += 0.5F;
                     else
                            f1 += 1.0F;
              }
              f2 = f1;
              return f2;
       }
       public int sid() {
              if (!this.valid)
                     update();
              return this.sid;
       }
       public void update() {
              this.isGsm = false;
              this.isCdma = false;
              this.cid = 0;
              this.lac = 0;
              this.mcc = 0;
              this.mnc = 0;
              CellLocation cellLocation = this.tel.getCellLocation();
              int nPhoneType = this.tel.getPhoneType();
              if (nPhoneType == 1 && cellLocation instanceof GsmCellLocation) {
                     this.isGsm = true;
                     GsmCellLocation gsmCellLocation = (GsmCellLocation) cellLocation;
                     int nGSMCID = gsmCellLocation.getCid();
                     if (nGSMCID > 0) {
                            if (nGSMCID != 65535) {
                                   this.cid = nGSMCID;
                                   this.lac = gsmCellLocation.getLac();
                            }
                     }
              }
              try {
                     String strNetworkOperator = this.tel.getNetworkOperator();
                     int nNetworkOperatorLength = strNetworkOperator.length();
                     if (nNetworkOperatorLength != 5) {
                            if (nNetworkOperatorLength != 6)
                                   ;
                     } else {
                            this.mcc = Integer.parseInt(strNetworkOperator.substring(0, 3));
                            this.mnc = Integer.parseInt(strNetworkOperator.substring(3, nNetworkOperatorLength));
                     }
                     if (this.tel.getPhoneType() == 2) {
                            this.valid = true;
                            Class<?> clsCellLocation = cellLocation.getClass();
                            Class<?>[] aryClass = new Class[0];
                            Method localMethod1 = clsCellLocation.getMethod("getBaseStationId", aryClass);
                            Method localMethod2 = clsCellLocation.getMethod("getSystemId", aryClass);
                            Method localMethod3 = clsCellLocation.getMethod("getNetworkId", aryClass);
                            Object[] aryDummy = new Object[0];
                            this.bid = ((Integer) localMethod1.invoke(cellLocation, aryDummy)).intValue();
                            this.sid = ((Integer) localMethod2.invoke(cellLocation, aryDummy)).intValue();
                            this.nid = ((Integer) localMethod3.invoke(cellLocation, aryDummy)).intValue();
                            Method localMethod7 = clsCellLocation.getMethod("getBaseStationLatitude", aryClass);
                            Method localMethod8 = clsCellLocation.getMethod("getBaseStationLongitude", aryClass);
                            this.lat = ((Integer) localMethod7.invoke(cellLocation, aryDummy)).intValue();
                            this.lng = ((Integer) localMethod8.invoke(cellLocation, aryDummy)).intValue();
                            this.isCdma = true;
                     }
              } catch (Exception ex) {
                     Log.e("CellInfoManager", ex.getMessage());
              }
       }
       class CellInfoListener extends PhoneStateListener {
              CellInfoListener(CellInfoManager manager) {
              }
              public void onCellLocationChanged(CellLocation paramCellLocation) {
                     CellInfoManager.this.valid = false;
              }
              public void onSignalStrengthChanged(int paramInt) {
                     CellInfoManager.this.asu = paramInt;
              }
       }
}
